// 版权所有2016 Go作者。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// go:build dragonfly | | freebsd | | netbsd 
// +build dragonfly freebsd netbsd 

package os

import (
	"runtime"
	"syscall"
)

const _P_PID = 0

// /阻止在调用p之前无法等待的阻止尝试。等待
// 立即成功，并报告是否成功。
// 它实际上不调用p.Wait。
func (p *Process) blockUntilWaitable() (bool, error) {
	var errno syscall.Errno
	for {
		// 32位FreeBSD上的参数如下所示：
		// /-freebsd32_wait6_args{idtype，id1，id2，status，options，wrusage，info}或
		// /-freebsd32_wait6_args{idtype，pad，id1，id2，status，options，wrusage，info}当ARM、MIPS或PowerPC 
		if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" {
			_, _, errno = syscall.Syscall9(syscall.SYS_WAIT6, _P_PID, uintptr(p.Pid), 0, 0, syscall.WEXITED|syscall.WNOWAIT, 0, 0, 0, 0)
		} else if runtime.GOOS == "freebsd" && runtime.GOARCH == "arm" {
			_, _, errno = syscall.Syscall9(syscall.SYS_WAIT6, _P_PID, 0, uintptr(p.Pid), 0, 0, syscall.WEXITED|syscall.WNOWAIT, 0, 0, 0)
		} else {
			_, _, errno = syscall.Syscall6(syscall.SYS_WAIT6, _P_PID, uintptr(p.Pid), 0, syscall.WEXITED|syscall.WNOWAIT, 0, 0)
		}
		if errno != syscall.EINTR {
			break
		}
	}
	runtime.KeepAlive(p)
	if errno == syscall.ENOSYS {
		return false, nil
	} else if errno != 0 {
		return false, NewSyscallError("wait6", errno)
	}
	return true, nil
}
